A program executing in a virtual machine (e.g., a Java virtual machine) that needs to send a message to a program executing in another virtual machine may be able to access inter-process communication mechanisms provided in an underlying operating system. However, this approach assumes that the communication mechanisms provided by the sender's operating system are compatible with those of the receiver's operating system. Another technique is remote method invocation (RMI), such as Java RMI, which allows methods on an object in one virtual machine to be invoked by a program executing in a different virtual machine. A drawback of Java RMI is that its use can require altering existing classes to work within a stub/skeleton paradigm, which can be cumbersome for programmers.